home *** CD-ROM | disk | FTP | other *** search
- 10 ! ******************************************************************
- 20 ! Example: Bar/Meter/Limits
- 30 !
- 40 ! This program demonstrates the use of the BAR, METER, and LIMITS
- 50 ! widgets.
- 60 !
- 70 ! The program creates three widgets and sets them up and down through
- 80 ! their default range of 1 through 100. You can set the LOW LIMIT
- 90 ! and HIGH LIMIT thresholds on both the widgets using a pair of SLIDER
- 100 ! widgets. As the program passes through the thresholds, it changes
- 110 ! the color and string on a LABEL via use of events.
- 120 !
- 130 ! The program sets up the widgets, sets up events on the SLIDERS and
- 140 ! BAR (no event is set up on other widgets, since the method is the
- 150 ! same), and then goes through a loop from 1 to 100 and then back
- 160 ! down again, changing the widgets with each count.
- 170 !
- 180 ! A routine called "Lobound" handles the SLIDER that sets the lower
- 190 ! trip limit, a routine called "Hibound" that handles the LIMIT that
- 200 ! sets the higher trip limit, and a routine called "Trip" that handles
- 210 ! the BAR events.
- 220 !
- 230 ! Some features of this program are:
- 240 !
- 250 ! - The program will NOT allow you to set the HIGH LIMIT below the
- 260 ! LOW LIMIT, or the inverse. Try to scroll into these regions and
- 270 ! the slidebar will pop back.
- 280 !
- 290 ! - Normally a BAR event is "level sensitive": if you set an event
- 300 ! to happen on the "HIGH" ALARM RANGE, you get an event each and
- 310 ! every time you write a value to that range. For this program,
- 320 ! however, an event occurs only on transition between ALARM RANGEs.
- 330 !
- 340 ! *******************************************************************
- 350 !
- 360 ! Variables used:
- 370 !
- 380 ! N: Loop counter
- 390 ! Hibound: Stores METER HIGH LIMIT
- 400 ! Lobound: Stores METER LOW LIMIT
- 410 ! Sts: Used to RETURN items from widgets
- 420 !
- 430 INTEGER N,Hibound,Lobound,Sts
- 440 Hibound=100
- 450 Lobound=1
- 460 !
- 470 ! Define colors
- 480 !
- 490 INTEGER Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
- 500 DATA 0,1,2,3,4,5,6,7
- 510 READ Black,White,Red,Yellow,Green,Cyan,Blue,Magenta
- 520 !
- 530 ! Declare variables for display handling
- 540 !
- 550 INTEGER D(1:4),Dw,Dh,Cursor
- 560 INTEGER Pw,Ph,Px,Py,Iw,Ih,Gx,Gy
- 570 INTEGER Mx,My,Mh,Mw,Brx,Bry,Brh,Brw
- 580 INTEGER Lmx,Lmy,Lmh,Lmw,Lx,Ly,Lh,Lw
- 590 INTEGER Lshx,Lshy,Lshw,Lshh,S2x,S2y,S2w,S2h
- 600 INTEGER Lslx,Lsly,Lslw,Lslh,Slx,Sly,Slw,Slh
- 610 !
- 620 ! Get display dimensions
- 630 !
- 640 GESCAPE CRT,3;D(*)
- 650 Dw=D(3)-D(1)
- 660 Dh=D(4)-D(2)
- 670 !
- 680 ! Set up PANEL dimensions, so that PANEL scales to display
- 690 !
- 700 Pw=Dw*.8 ! PANEL width
- 710 Ph=Dh*.9 ! PANEL height
- 720 Px=(Dw-Pw)/2! Center PANEL along width
- 730 Py=(Dh-Ph)/2! Center PANEL above DISP line
- 740 !
- 750 ! Build main PANEL
- 760 !
- 770 CLEAR SCREEN
- 780 !
- 790 ASSIGN @Main TO WIDGET "PANEL";SET ("VISIBLE":0)
- 800 CONTROL @Main;SET ("X":Px,"Y":Py,"WIDTH":Pw,"HEIGHT":Ph)
- 810 CONTROL @Main;SET ("MAXIMIZABLE":0,"RESIZABLE":0)
- 820 CONTROL @Main;SET ("TITLE":" Example: Bar Meter Limits")
- 830 CONTROL @Main;SET ("SYSTEM MENU":"Quit")
- 840 !
- 850 ! Get interior dimensions of PANEL
- 860 !
- 870 STATUS @Main;RETURN ("INSIDE WIDTH":Iw,"INSIDE HEIGHT":Ih)
- 880 !
- 890 ! Set up widget dimensions
- 900 !
- 910 Gx=Iw*.02 ! Gap between widgets
- 920 Gy=Gx
- 930 !
- 940 Mw=Iw*.45 ! METER parameters
- 950 Mh=Ih*.5
- 960 Mx=Gx
- 970 My=Gy
- 980 !
- 990 Brw=(Iw-(Mw+2*Gx))*.3! BAR parameters
- 1000 Brh=Mh
- 1010 Brx=Mx+Mw+Gx
- 1020 Bry=My
- 1030 !
- 1040 Lmw=Mw+Gy+Brw ! LIMITS parameters
- 1050 Lmh=Ih-(Mh+3*Gy)
- 1060 Lmx=Gx
- 1070 Lmy=My+Mh+Gy
- 1080 !
- 1090 Lw=Iw-(Mw+Brw+4*Gy)! Indicator LABEL parameters
- 1100 Lh=Lw*.5
- 1110 Lx=Iw-(Lw+Gx)
- 1120 Ly=Gy
- 1130 !
- 1140 Lshw=(Lw-Gy)/2! High limit LABEL
- 1150 Lshh=Lshw*.4
- 1160 Lshx=Lx
- 1170 Lshy=Ly+Lh+Gy
- 1180 !
- 1190 Shw=Lshw ! High limit SLIDER
- 1200 Shh=(Ih-(4*Gy+Lh+Lshh))
- 1210 Shx=Lx
- 1220 Shy=Lshy+Lshh+Gy
- 1230 !
- 1240 Lslw=Lshw ! Low limit LABEL
- 1250 Lslh=Lshh
- 1260 Lslx=Lshx+Lshw+Gx
- 1270 Lsly=Lshy
- 1280 !
- 1290 Slw=Shw ! Low limit SLIDER
- 1300 Slh=Shh
- 1310 Slx=Lslx
- 1320 Sly=Shy
- 1330 !
- 1340 ! Build rest of PANEL
- 1350 !
- 1360 ! Create METER. (There is no need to set ALL these
- 1370 ! attributes, but this is an example program).
- 1380 !
- 1390 ! The three METER ranges are assigned as red, white and blue -
- 1400 ! an arbitrary choice.
- 1410 !
- 1420 ASSIGN @Meter TO WIDGET "METER";PARENT @Main
- 1430 CONTROL @Meter;SET ("X":Mx,"Y":My,"WIDTH":Mw,"HEIGHT":Mh)
- 1440 CONTROL @Meter;SET ("HIGH PEN":Red,"MIDDLE PEN":White,"LOW PEN":Blue)
- 1450 CONTROL @Meter;SET ("VALUE BACKGROUND":Yellow,"VALUE PEN":Black)
- 1460 CONTROL @Meter;SET ("LIMITS BACKGROUND":Blue,"LIMITS PEN":White)
- 1470 CONTROL @Meter;SET ("NEEDLE PEN":Blue,"METER BACKGROUND":Green)
- 1480 CONTROL @Meter;SET ("SWEEP ANGLE":175)
- 1490 !
- 1500 ! Create BAR. Basically the same, but not as many options.
- 1510 !
- 1520 ASSIGN @Bar TO WIDGET "BAR";PARENT @Main
- 1530 CONTROL @Bar;SET ("X":Brx,"Y":Bry,"WIDTH":Brw,"HEIGHT":Brh)
- 1540 CONTROL @Bar;SET ("HIGH PEN":Red,"MIDDLE PEN":White,"LOW PEN":Blue)
- 1550 !
- 1560 ! Create LIMITS
- 1570 !
- 1580 ASSIGN @Lim TO WIDGET "LIMITS";PARENT @Main
- 1590 CONTROL @Lim;SET ("X":Lmx,"Y":Lmy,"WIDTH":Lmw,"HEIGHT":Lmh)
- 1600 CONTROL @Lim;SET ("INSIDE PEN":White,"OUTSIDE PEN":Magenta)
- 1610 !
- 1620 ! Create LABEL to indicate METER range
- 1630 !
- 1640 ASSIGN @Label TO WIDGET "LABEL";PARENT @Main
- 1650 CONTROL @Label;SET ("X":Lx,"Y":Ly,"WIDTH":Lw,"HEIGHT":Lh)
- 1660 CONTROL @Label;SET ("BORDER":0,"BACKGROUND":White,"VALUE":"NORM")
- 1670 !
- 1680 ! Create LABEL for HIGH LIMIT SLIDER
- 1690 !
- 1700 ASSIGN @Lsh TO WIDGET "LABEL";PARENT @Main
- 1710 CONTROL @Lsh;SET ("X":Lshx,"Y":Lshy,"WIDTH":Lshw,"HEIGHT":Lshh)
- 1720 CONTROL @Lsh;SET ("VALUE":"High")
- 1730 !
- 1740 ! Create SLIDER to set HIGH LIMIT
- 1750 !
- 1760 ASSIGN @Sh TO WIDGET "SLIDER";PARENT @Main
- 1770 CONTROL @Sh;SET ("X":Shx,"Y":Shy,"WIDTH":Shw,"HEIGHT":Shh)
- 1780 CONTROL @Sh;SET ("DIRECT MOVE":1,"AUTO REPEAT":1)
- 1790 CONTROL @Sh;SET ("VALUE":100)
- 1800 !
- 1810 ! Create LABEL for LOW LIMIT SLIDER
- 1820 !
- 1830 ASSIGN @Lsl TO WIDGET "LABEL";PARENT @Main
- 1840 CONTROL @Lsl;SET ("X":Lslx,"Y":Lsly,"WIDTH":Lslw,"HEIGHT":Lslh)
- 1850 CONTROL @Lsl;SET ("VALUE":"Low")
- 1860 !
- 1870 ! Create SLIDER to set LOW LIMIT
- 1880 !
- 1890 ASSIGN @Sl TO WIDGET "SLIDER";PARENT @Main
- 1900 CONTROL @Sl;SET ("X":Slx,"Y":Sly,"WIDTH":Slw,"HEIGHT":Slh)
- 1910 CONTROL @Sl;SET ("DIRECT MOVE":1,"AUTO REPEAT":1)
- 1920 !
- 1930 ! Call bounds handlers to set up initial bounds, then
- 1940 ! make main PANEL visible. (The bounds handlers will
- 1950 ! both call the "Trip" routine to initialize the BAR event.)
- 1960 !
- 1970 GOSUB Hibound
- 1980 GOSUB Lobound
- 1990 CONTROL @Main;SET ("VISIBLE":1)
- 2000 !
- 2010 ! Set up the event handlers
- 2020 !
- 2030 N=1
- 2040 ON EVENT @Sl,"DONE" GOSUB Lobound! Event for LOW LIMIT SLIDER
- 2050 ON EVENT @Sh,"DONE" GOSUB Hibound! Event for HI LIMIT SLIDER
- 2060 ON EVENT @Bar,"ALARM" GOSUB Trip! Event for BAR
- 2070 ON EVENT @Main,"SYSTEM MENU" GOTO Finis! Event for QUIT toaster menu
- 2080 !
- 2090 ! Count from 1 to 100 and back down, and set METER and
- 2100 ! BAR as this is done.
- 2110 !
- 2120 LOOP
- 2130 FOR N=1 TO 100
- 2140 CONTROL @Meter;SET ("VALUE":N)
- 2150 CONTROL @Bar;SET ("VALUE":N)
- 2160 CONTROL @Lim;SET ("VALUE":N)
- 2170 NEXT N
- 2180 FOR N=100 TO 1 STEP -1
- 2190 CONTROL @Meter;SET ("VALUE":N)
- 2200 CONTROL @Bar;SET ("VALUE":N)
- 2210 CONTROL @Lim;SET ("VALUE":N)
- 2220 NEXT N
- 2230 END LOOP
- 2240 !
- 2250 ! ********************* End of Main Program ************************
- 2260 !
- 2270 ! Handler for LOW LIMIT SLIDER:
- 2280 !
- 2290 Lobound:!
- 2300 DISABLE
- 2310 STATUS @Sl;RETURN ("VALUE":Lobound)! Get SLIDER VALUE
- 2320 IF Lobound>Hibound THEN ! If higher than HIGH LIMIT:
- 2330 Lobound=Hibound ! Make sure it is not
- 2340 CONTROL @Sl;SET ("VALUE":Lobound)
- 2350 END IF
- 2360 CONTROL @Meter;SET ("LOW LIMIT":Lobound)! Set limit on widgets
- 2370 CONTROL @Bar;SET ("LOW LIMIT":Lobound)
- 2380 CONTROL @Lim;SET ("LOW LIMIT":Lobound)
- 2390 GOSUB Trip ! Adjust BAR event handling
- 2400 ENABLE
- 2410 RETURN
- 2420 !
- 2430 ! HIGH LIMIT SCROLL BAR event handler
- 2440 !
- 2450 Hibound:!
- 2460 DISABLE
- 2470 STATUS @Sh;RETURN ("VALUE":Hibound)! Get SLIDER VALUE
- 2480 IF Hibound<Lobound THEN ! If HIGH LIMIT < LOW LIMIT:
- 2490 Hibound=Lobound ! Make sure it is not
- 2500 CONTROL @Sh;SET ("VALUE":Hibound)
- 2510 END IF
- 2520 CONTROL @Meter;SET ("HIGH LIMIT":Hibound)! Reflect on METER & LIMITS
- 2530 CONTROL @Bar;SET ("HIGH LIMIT":Hibound)
- 2540 CONTROL @Lim;SET ("HIGH LIMIT":Hibound)
- 2550 GOSUB Trip! Adjust event handling
- 2560 ENABLE
- 2570 RETURN
- 2580 !
- 2590 ! BAR event handler.
- 2600 ! You get the current value being sent to the BAR and determine
- 2610 ! the range it is in. Then, you set the event to occur on the
- 2620 ! adjoining range(s). This ensures that you only get an event when
- 2630 ! you transition between ranges.
- 2640 !
- 2650 ! As noted, the bounds handlers call Trip to adjust events. Since
- 2660 ! you are changing the HIGH & LOW LIMITs with the bounds handlers,
- 2670 ! you want to make sure that the events are rearranged accordingly.
- 2680 !
- 2690 Trip:!
- 2700 DISABLE
- 2710 SELECT N
- 2720 CASE <Lobound
- 2730 CONTROL @Bar;SET ("ALARM RANGES":"MIDDLE","ALARM TYPE":"EVENT")
- 2740 CONTROL @Label;SET ("BACKGROUND":Blue,"VALUE":"LOW")
- 2750 CASE <=Hibound
- 2760 CONTROL @Bar;SET ("ALARM RANGES":"LOW,HIGH","ALARM TYPE":"EVENT")
- 2770 CONTROL @Label;SET ("BACKGROUND":White,"VALUE":"NORM")
- 2780 CASE >Hibound
- 2790 CONTROL @Bar;SET ("ALARM RANGES":"MIDDLE","ALARM TYPE":"EVENT")
- 2800 CONTROL @Label;SET ("BACKGROUND":Red,"VALUE":"HIGH")
- 2810 END SELECT
- 2820 ENABLE
- 2830 RETURN
- 2840 !
- 2850 Finis:!
- 2860 ASSIGN @Main TO *! Delete PANEL widget
- 2870 END
-